/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package feuerwehr;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author gundlape
 */
public class Fahrzeug {

    public Fahrzeug(int pk, String bezeichnung, Timestamp einrueckzeit, Timestamp ausrueckzeit, String funkrufname, String opta, String standort) {
        this.pk = pk;
        this.bezeichnung = bezeichnung;
        this.einrueckzeit = einrueckzeit;
        this.ausrueckzeit = ausrueckzeit;
        this.funkrufname = funkrufname;
        this.opta = opta;
        this.standort = standort;
    }
    
    /**
     * Liste aller möglichen Fahrzeuge erstellen
     * @return Array mit allen Fahrzeugen
     */
    public static ArrayList <Fahrzeug> getFahrzeug() {
        ArrayList <Fahrzeug> al = new ArrayList();
        try {
            PreparedStatement ps = Feuerwehr.getConnection().prepareStatement("select * from t_fahrzeug order by sortierung desc, standort, opta");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Fahrzeug p = new Fahrzeug(rs.getInt("pk"), rs.getString("bezeichnung"), null, null, rs.getString("funkrufname"), rs.getString("opta"), rs.getString("standort"));
                al.add(p);
            }
            rs.close();
            ps.close();            
        } catch (SQLException exc) {
            System.err.println("ERROR[Fahrzeug]: " + exc.toString());
        }
        return al;
    }    

    /**
     * Liste aller aktuellen Fahrzeuge erstellen
     * @param iEinsatzPK Der aktuelle Einsatz-PK
     * @return Array mit allen Fahrzeugen
     */
    public static ArrayList <Fahrzeug> getAktuelleFahrzeug(int iEinsatzPK) {
        ArrayList <Fahrzeug> al = new ArrayList();
        try {
            PreparedStatement ps = Feuerwehr.getConnection().prepareStatement("select tf.pk , tf.bezeichnung, tef.einrueckzeit, tef.ausrueckzeit, tf.funkrufname, tf.opta, tf.standort from t_fahrzeug tf, t_e_fahrzeug tef where tf.pk = tef.fk_fahrzeug and tef.fk_einsatz = ? order by tf.bezeichnung");
            ps.setInt(1, iEinsatzPK);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Fahrzeug p = new Fahrzeug(rs.getInt("pk"), rs.getString("bezeichnung"), rs.getTimestamp("einrueckzeit"), rs.getTimestamp("ausrueckzeit"), rs.getString("funkrufname"), rs.getString("opta"), rs.getString("standort"));
                al.add(p);
            }
            rs.close();
            ps.close();            
        } catch (SQLException exc) {
            System.err.println("ERROR[Fahrzeug]: " + exc.toString());
        }
        return al;
    }    

    
    /**
     * Ein Fahrzeug zurückgeben
     * @param iPK Der Fahrzeug-PK
     * @return Fahrzeug
     */
    public static Fahrzeug getEinFahrzeug(int iPK) {
        Fahrzeug f = null;
        try {
            PreparedStatement ps = Feuerwehr.getConnection().prepareStatement("select * from t_fahrzeug where pk = ?");
            ps.setInt(1, iPK);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                f = new Fahrzeug(rs.getInt("pk"), rs.getString("bezeichnung"), null, null, rs.getString("funkrufname"), rs.getString("opta"), rs.getString("standort"));
            }
            rs.close();
            ps.close();            
        } catch (SQLException exc) {
            System.err.println("ERROR[Fahrzeug]: " + exc.toString());
        }
        return f;
    }    

    
    public static boolean pruefeVerfuegbarkeitFahrzeug(int iEinsatzPK, String sFahrzeug, Timestamp ausrueckzeit, Timestamp einrueckzeit) {
        Timestamp t1 = null, t2 = null;
        int fk_einsatz = -1;
        String einsatznr = "";
        String fahrzeug = "";
        boolean istEinsatz=false;
        
        if ((einrueckzeit == null) && (ausrueckzeit == null))
            return true;
        
        // Dies hier kann zu Problemen führen!!!
        if (einrueckzeit == null)
            einrueckzeit = new Timestamp(ausrueckzeit.getTime() + (60 * 60 * 1000L));      // Plus eine Stunde

        try {
            PreparedStatement ps = Feuerwehr.getConnection().prepareStatement("select tf.pk, tf.bezeichnung, tf.standort, tf.opta, tef.fk_einsatz, tef.ausrueckzeit, tef.einrueckzeit " +
                                                                              "from t_fahrzeug tf join t_e_fahrzeug tef " +
                                                                              "on tf.pk = tef.fk_fahrzeug " +
                                                                              "where ifnull(tef.fk_einsatz, ?) != ? " +
                                                                              "and ? between case when tef.ausrueckzeit>? then ? else tef.ausrueckzeit end and ifnull(tef.einrueckzeit, ?) " +
                                                                              "and ? between case when tef.ausrueckzeit>? then ? else tef.ausrueckzeit end and ifnull(tef.einrueckzeit, ?) ");
            ps.setInt(1, iEinsatzPK);
            ps.setInt(2, iEinsatzPK);
            ps.setTimestamp(3, ausrueckzeit);
            ps.setTimestamp(4, ausrueckzeit);
            ps.setTimestamp(5, ausrueckzeit);
            ps.setTimestamp(6, einrueckzeit);
            ps.setTimestamp(7, einrueckzeit);
            ps.setTimestamp(8, ausrueckzeit);
            ps.setTimestamp(9, ausrueckzeit);
            ps.setTimestamp(10, einrueckzeit);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                if (sFahrzeug.equals(rs.getString(1))) {
                    istEinsatz=true;
                    t1 = rs.getTimestamp("ausrueckzeit");
                    t2 = rs.getTimestamp("einrueckzeit");
                    fk_einsatz = rs.getInt("fk_einsatz");
                    fahrzeug = rs.getString("opta") + " (" + rs.getString("bezeichnung") + " " + rs.getString("standort") + ")";
                    PreparedStatement ps2 = Feuerwehr.getConnection().prepareStatement("select einsatznr from t_einsatz where pk = ?");
                    ps2.setInt(1, fk_einsatz);
                    ResultSet rs2 = ps2.executeQuery();
                    while (rs2.next()) {
                        einsatznr = rs2.getString(1);
                    }
                    rs2.close();
                    ps2.close();
                }
            }
            rs.close();
            ps.close();
            if (istEinsatz == true) {
                String s2 = "unbekannt";
                if (t2 != null) {
                    s2 = Feuerwehr.formatDatum(t2, "dd.MM.yyyy HH:mm:ss");
                }
                String s = "Das Fahrzeug " + fahrzeug + " ist im Einsatz für " + einsatznr + "\r\n" +
                           "seit " + Feuerwehr.formatDatum(t1, "dd.MM.yyyy HH:mm:ss") + " bis " + s2;
                JOptionPane.showMessageDialog(null, s, Feuerwehr.STR_VERSION, JOptionPane.WARNING_MESSAGE);
                return false;
            }
        } catch (SQLException exc) {
            System.err.println("ERROR[pruefeVerfuegbarkeitFahrzeug]: " + exc.toString());
        }
        
        return true;
    }
    
    /**
     * Die Einrückzeit als String zurückgegen
     * @return Datum als String
     */
    public String getEinrueckzeit() {
        if (einrueckzeit == null)
            return "";
        return Feuerwehr.formatDatum(einrueckzeit, "dd.MM.yyyy HH:mm:ss");
    }

    /**
     * Die Ausrückzeit als String zurückgegen
     * @return Datum als String
     */
    public String getAusrueckzeit() {
        if (ausrueckzeit == null)
            return "";
        return Feuerwehr.formatDatum(ausrueckzeit, "dd.MM.yyyy HH:mm:ss");
    }
    
    /**
     * Den PK als String zurückgeben
     * @return Der PK
     */
    public String getPK() {
        return Integer.toString(pk);
    }

    public String toString2() {
        String s = standort + " " + bezeichnung;
        while (s.length() < 30) {                           // Auffüllen mit Leerzeichen
            s = s + " ";
        }
        return s + opta + " (" + funkrufname + ")";
    }
    
    @Override
    public String toString() {
        return opta + " (" + bezeichnung + " " + standort + ")";
    }
    
    private final int pk;
    private final String bezeichnung;
    private final Timestamp einrueckzeit;
    private final Timestamp ausrueckzeit;
    private final String funkrufname;
    private final String opta;
    private final String standort;
}
